<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>01_类的基本知识</title>
    <link rel="shortcut icon" href="../../favicon.ico">
</head>
<body>
<script type="text/javascript">
    /*
        总结：
            1、类中的构造器不是必须写的，要对实例进行一些初始化的操作，如添加指定属性时才写。
            2、如果A类继承了B类，且A类中写了构造器，那么在B类中A类构造器中的super时必须调用的。
            3、类中所定义的方法，都是放在类的原型对象上，供实例去使用。
     */


    // 创建一个Person类
    class Person {
        // 构造器方法
        constructor(name, age) {
            // 构造器中的this是谁？--类的实例对象
            this.name = name;
            this.age = age;
        }

        // 一般方法
        speak() {
            // speak方法放在了哪里？--类的原型对象上，供实例使用
            // 通过Person实例调用speak时，speak中的this就是Person实例
            console.log(`我是${this.name},我的年龄是${this.age}`)
        }
    }

    // 创建一个实例对象
    // const p1 = new Person('tom', 18);
    // const p2 = new Person('jerry', 19);
    // console.log(p1)
    // console.log(p2)
    // p1.speak()
    // p2.speak()

    // 创建一个Student类，继承Person类
    class Student extends Person {
        constructor(name, age, grade) {
            super(name, age);
            this.grade = grade;
        }

        // 重写父类继承过来的方法
        speak() {
            console.log(`我是${this.name},我的年龄是${this.age},我读的是${this.grade}`)
        }

        study() {
            // study方法放在了哪里？--类的原型对象上，供实例使用
            // 通过Student实例调用study时，Student中的this就是Person实例
            console.log('我很努力的学习')
        }
    }

    // const s1 = new Student('小张', 16);
    // console.log(s1)
    // const s2 = new Student('小张', 16, '三年级');
    // console.log(s2)
    // s2.speak();
    // s2.study()

    class Car {
        constructor(name, price) {
            this.name = name;
            this.price = price;
            // this.wheel = 4;
        }

        // 类中可以直接写赋值语句
        wheel = 4;
    }

    const c1 = new Car('奔驰', '300');
    const c2 = new Car('宝马', '300');
    console.log(c1)
    console.log(c2)
</script>
</body>
</html>